#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<wait.h>
#include<stdlib.h>
#include<iostream>
#include<vector>

using namespace std;
typedef void (*handler_t)(); 


void func1()
{
    printf("任务1\n");
}

void func2()
{
    printf("任务2\n");
}

std::vector<handler_t> handlers;
//加载函数
void Load()
{
    handlers.push_back(func1);
    handlers.push_back(func2);
}

int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        exit(1);
    }
    else if(id == 0)
    {
        //子进程
        int cnt = 3;
        while(cnt--)
        {
            printf("子进程 pid: %d ppid: %d\n",getpid(),getppid());
            sleep(1);
        }
        exit(11);
    }
    else{
        //父进程
        int status = 0;
        int quit = 0;
        while(!quit)
        {
            pid_t ret = waitpid(id, &status, WNOHANG);

            if(ret < 0)
            {
                perror("waitpid");
                exit(1);
            }
            else if(ret == 0)
            {
                //子进程没有退出
                if(handlers.empty())
                    Load();
                for(auto iter:handlers)
                {
                    iter();
                }
                sleep(1);
            }
            else
            {
                 if(WIFEXITED(status))
                 {
                     printf("退出码: %d\n",WEXITSTATUS(status));
                 }
                 else if(WIFSIGNALED(status))
                 {
                     printf("退出信号: %d\n",WTERMSIG(status));
                 }
                 quit = 1;
            }

        }

        //printf("父进程 ret: %d 退出码: %d 退出信号: %d\n", ret, (status >> 8)&0xFF, status&0x7F);
    }


    return 0;
}
